/*
 * main.cpp - Grupo 5 - Prog. Avanzada 2011
 *
 *  Javier Dominguez - 4.901.161-6
 *  Marcelo Parada - 1.977.094-9
 *  Rodrigo Ruiz - 4.481.611-2
 *  Maximiliano Silvera - 4.106.938-6
 */
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string>
#include "dt/UsuarioDT.h"
#include "logica/IRegistroUsuario.h"
#include "util/ControllerFactory.h"

void cabecera();
void menuPrincipal();
int iniciarCU(int opcion);
int salir();
int registroUsuario();
int compartirTemaSingle();
int compartirPistaAlbum();
int consultarInfoTema();
int eliminarTema();
int etiquetar();
int reproducirTema();
int salir();

int mostrarListadoUsuarios();

using namespace std;

int main()
{
	int opcion;

	while(true)
	{
		system("clear");

		menuPrincipal();

		cin >> opcion;

		/*
		 * Se invoca el metodo que corresponda a la opcion seleccionada,
		 * si este retorna 0 entonces se cierra la aplicacion.
		 */
		if(iniciarCU(opcion) == 0)
		{
			return 0;
		}
	}
}

/*
 * Imprie la cabecera de la pantalla
 */
void cabecera()
{
	system("clear");

	cout << "------------------------------------------------------------------------- \n";
	cout << "|         .:: Prog. Avanzada 2011 - Grupo 5 - Tarea 7 ::.               | \n";
	cout << "------------------------------------------------------------------------- \n\n";
}

/*
 * Dibuja el menu principal
 */
void menuPrincipal()
{
	cabecera();

	cout << "1. Registrar de Usuario. \n";
	cout << "2. Compartir Tema Single. \n";
	cout << "3. Compartir Pista Album. \n";
	cout << "4. Consultar Información Tema. \n";
	cout << "5. Eliminar Tema. \n";
	cout << "6. Etiquetar. \n";
	cout << "7. Reproducir Tema. \n";
	cout << "8. Mostrar listado usuarios. \n";
	cout << "0. Salir. \n\n";

	cout << "Indique la opcion deseada: ";
}

/*
 * Inicia el Caso de uso correspondiente de acuerdo a la opcion
 * ingresada por el usuario
 */
int iniciarCU(int opcion)
{
	cabecera();

	if(opcion == 0)
	{
		return salir();
	}
	else if(opcion == 1)
	{
		return registroUsuario();
	}
	else if(opcion == 2)
	{
		return compartirTemaSingle();
	}
	else if(opcion == 3)
	{
		return compartirPistaAlbum();
	}
	else if(opcion == 4)
	{
		return consultarInfoTema();
	}
	else if(opcion == 5)
	{
		return eliminarTema();
	}
	else if(opcion == 6)
	{
		return etiquetar();
	}
	else if(opcion == 7)
	{
		return reproducirTema();
	}
	else if(opcion == 8)
	{
		return mostrarListadoUsuarios();
	}

	return 1;
}

int salir()
{
	cout << "Gracias por todo, presione una tecla para salir.";

	getchar();
	getchar();

	system("clear");

	return 0;
}


/*
 * CU - Registro de Usuario
 */
int registroUsuario()
{
	IRegistroUsuario *controller = ControllerFactory::getInstance()->getRegistroUsuarioController();

	string nick;

	string nombre;

	string mail;

	cout << "Ingrese los datos del usuario.\n\n";

	cout << "Nombre: ";

	cin >> nombre;

	cout << "E-mail: ";

	cin >> mail;

	bool nickDisponible = false;

	while(!nickDisponible)
	{
		cout << "Nick: ";

		cin >> nick;

		nickDisponible = controller->nickDisponible(nick);

		if(!nickDisponible)
		{
			int opcion;

			cout << "Nick no disponible. [1: reintentar || 0: cancelar]:";

			cin >> opcion;

			if(opcion != 1)
			{
				return 0;
			}
		}
	}

	UsuarioDT *usuarioDT = new UsuarioDT(nick, nombre, mail);

	controller->registrarUsuario(usuarioDT);

	cout << "\nUsuario registrado correctamente.\n";

	getchar();

	getchar();

	// Limpio la memoria
	delete controller;

	delete usuarioDT;

	return 1;
}

int mostrarListadoUsuarios()
{
	IRegistroUsuario *controller = ControllerFactory::getInstance()->getRegistroUsuarioController();

	ColGeneric<UsuarioDT*> *listaUsuarios = controller->obtenerListadoUsuarios();

	listaUsuarios->~ColGeneric();

	cout << "Usuarios registrados despues borrar \n" << listaUsuarios->toString();

	return 1;
}

/*
 * CU - Compartir Tema Single
 */
int compartirTemaSingle()
{
	return 1;
}

/*
 * CU - Compartir Pista Album
 */
int compartirPistaAlbum()
{
	return 1;
}

/*
 * CU - Consultar Info Tema
 */
int consultarInfoTema()
{
	return 1;
}

/*
 * CU - Eliminar Tema
 */
int eliminarTema()
{
	return 1;
}

/*
 * CU - Etiquetar
 */
int etiquetar()
{
	return 1;
}

/*
 * CU - Reproducir Tema
 */
int reproducirTema()
{
	return 1;
}
